home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / eulisp / mpfeel.lha / MPFeel / Modules / initcode.em < prev    next >
Lisp/Scheme  |  1992-10-06  |  17KB  |  545 lines

  1. ;; Eulisp Module
  2. ;; Author: pab
  3. ;; File: initcode.em
  4. ;; Date: Mon Dec  9 22:36:26 1991
  5. ;;
  6. ;; Project:
  7. ;; Description: 
  8. ;;
  9.  
  10. (defmodule initcode
  11.   (threads arith calls symbols strings characters list-operators
  12.    streams vectors lists ccc tables classes (rename ((null Null)) class-names) errors
  13.    generics others module-operators formatted-io bit-vectors
  14.    root semaphores sockets) 
  15.   ()
  16.  
  17.   ;; install the callbacks
  18.  
  19.   
  20.   ;; define add-method
  21.  
  22.   (defun simple-add-method (gf meth)
  23.     ((lambda (sig table)
  24.        (if (null table)
  25.        (generic-method-table-setter gf (mk-initial-table sig (list meth)))
  26.      (add-meth-aux table sig (list meth)))
  27.        ;;(if (methodp (car (find-applicable-methods gf sig)))
  28.        ;;nil
  29.        ;;(cerror  (find-applicable-methods gf sig) nil))
  30.        ;; invalidate cache
  31.        (generic-fast-method-cache-setter gf nil)
  32.        (generic-slow-method-cache-setter gf nil)
  33.        gf)
  34.      (method-signature meth)
  35.      (generic-method-table gf)))
  36.   
  37.   (defun add-method-method (h1 h2 gf meth)
  38.     (simple-add-method gf meth))
  39.  
  40.   (defun mk-initial-table (initkey initentry)
  41.     (fold (lambda (class tab)
  42.         (cons (cons class tab) nil))
  43.       (reverse initkey)
  44.       initentry))
  45.  
  46.   ;; starting this lot up...
  47.   
  48.   (defun add-meth-aux (table sig meth)
  49.     ((lambda (xx)
  50.        (if (null table)
  51.        ;; should never happen
  52.        (swizzle)
  53.      (if (null xx)
  54.          (progn (nconc table
  55.                (fold (lambda (class tab)
  56.                    (cons (cons class tab) nil))
  57.                  (reverse sig)
  58.                  meth))
  59.             table)
  60.        (if (null (cdr sig))
  61.            ;; must have a relacement method
  62.            ((setter cdr) xx meth)
  63.          (add-meth-aux (cdr xx) (cdr sig) meth)))))
  64.      (my-assq (car sig) table)))
  65.  
  66.   (defun add-method-to-slow-cache (gf sig meths)
  67.     ((lambda (table)
  68.        (if (null table)
  69.        (generic-slow-method-cache-setter 
  70.         gf 
  71.         (mk-initial-table sig (cons sig meths)))
  72.      (add-meth-aux table sig (cons sig meths)))
  73.        table)
  74.      (generic-slow-method-cache gf)))
  75.  
  76.   (defun find-applicable-methods (gf sig)
  77.     (find-applic-methods-aux (generic-method-table gf)
  78.                  (mapcar class-precedence-list sig)))
  79.   
  80.   (export find-applicable-methods)
  81.   ;; wasteful...
  82.   (defun find-applic-methods-aux (table cpl-lst)
  83.     (if (null cpl-lst)
  84.     nil
  85.       (if (null (car cpl-lst))
  86.       nil
  87.     ((lambda (xx)
  88.        (if (null xx)
  89.            (find-applic-methods-aux table
  90.                     (cons (cdr (car cpl-lst))
  91.                           (cdr cpl-lst)))
  92.          (if (null (cdr cpl-lst))
  93.          ;; found summat
  94.          (if (methodp (car (cdr xx)))
  95.              (cons (car (cdr xx))
  96.                            (find-applic-methods-aux table
  97.                                                     (cons (cdr (car cpl-lst))
  98.                                                           (cdr cpl-lst))))
  99.            (progn (print "error-1")
  100.               (print (list xx cpl-lst))
  101.               (print "error-1")
  102.               (print (list xx cpl-lst))
  103.               nil))
  104.            (append (find-applic-methods-aux (cdr xx) (cdr cpl-lst))
  105.                (find-applic-methods-aux table
  106.                         (cons (cdr (car cpl-lst))
  107.                               (cdr cpl-lst)))))))
  108.      (my-assq (car (car cpl-lst)) table)))))
  109.       
  110.   (defun find-and-call-generic (gf args)
  111.     (find-and-call-generic-1 gf args (mapcar class-of args)))
  112.  
  113.   (defun find-and-call-generic-1 (gf args sig)
  114.     ((lambda (meths)
  115.        (if (null meths) 
  116.        (progn (setq x (list gf sig args))
  117.           (error "No applicable method" Internal-Error 
  118.              'error-value (list gf sig)))
  119.      (progn (add-method-to-slow-cache gf sig meths)
  120.         (generic-fast-method-cache-setter gf 
  121.                           (cons sig meths))
  122.         (if (methodp (car meths))
  123.             (call-method-by-list meths args)
  124.           (cerror meths nil)))))
  125.      ((generic-discriminator gf) sig)))
  126.   
  127.   ;; use this at bootstrap...
  128.   (defun default-compute-discriminating-function (gf)
  129.     (lambda (sig)
  130.       (find-applicable-methods gf sig)))
  131.   
  132.   (defun compute-discriminating-function-as-method (foo bar gf)
  133.     (lambda (sig)
  134.       (find-applicable-methods gf sig)))
  135.  
  136.   ;; add as a method...
  137.  
  138.   ;; necessary functions
  139.   
  140.   (defun fold (fn lst val)
  141.     (if (null lst) val
  142.       (fold fn (cdr lst)
  143.         (fn (car lst) val))))
  144.   
  145.   (defun reverse (x)
  146.     (fold cons x nil))
  147.  
  148.   (defun my-mapcar (fn lst)
  149.     (if (null lst) nil
  150.       (cons (fn (car lst))
  151.         (mapcar fn (cdr lst)))))
  152.  
  153.   (defun my-assq (obj lst)
  154.     (if (null lst) nil
  155.       (if (eq (car (car lst)) obj) 
  156.       (car lst)
  157.     (my-assq obj (cdr lst)))))
  158.  
  159.   ;; Should have enough in place now...
  160.  
  161.   (set-compute-and-apply-fn find-and-call-generic)
  162.  
  163.   ;; very much hacked up bootstrap
  164.   
  165.   (defun init-generic (gf)
  166.     (generic-discriminator-setter gf
  167.                   (default-compute-discriminating-function gf)))
  168.  
  169.   ;; bung in the discriminators...
  170.   (init-generic allocate-instance)
  171.   (init-generic initialize-instance)
  172.   (init-generic compute-discriminating-function)
  173.   (init-generic add-method)
  174.   (init-generic compute-class-precedence-list)
  175.   (init-generic slot-value-using-class)
  176.   (init-generic (setter slot-value-using-class))
  177.   (init-generic slot-value-using-slot-description)
  178.   (init-generic (setter slot-value-using-slot-description))
  179.   (init-generic find-slot-description)
  180.   (init-generic make-slot-description)
  181.   (init-generic make-inherited-slot-description)
  182.   (init-generic add-slot-description)
  183.   (init-generic generic-write)
  184.   (init-generic generic-prin)
  185.   (init-generic binary-plus)
  186.   (init-generic binary-times)
  187.   (init-generic binary-difference)
  188.   (init-generic binary-divide)
  189.   (init-generic binary-gcd)
  190.   (init-generic binary-lcm)
  191.   (init-generic binary-lcm)
  192.   (init-generic =)
  193.   (init-generic zerop)
  194.   (init-generic abs)
  195.   (init-generic binary-lt)
  196.   (init-generic binary-gt)
  197.   (init-generic equal)
  198.   (init-generic copy)
  199.  
  200.   (simple-add-method allocate-instance 
  201.           (generic_initialize_instance\,Method
  202.            (generic_allocate_instance\,Method_Class method nil)
  203.            (list 'signature (list method-class object)
  204.              'function generic_allocate_instance\,Method_Class)))
  205.           
  206.  
  207.   (simple-add-method initialize-instance 
  208.           (generic_initialize_instance\,Method
  209.            (generic_allocate_instance\,Method_Class method nil)
  210.            (list 'signature (list method object)
  211.              'function generic_initialize_instance\,Method)))
  212.           
  213.   (simple-add-method add-method
  214.           (generic_initialize_instance\,Method
  215.            (generic_allocate_instance\,Method_Class method nil)
  216.            (list 'signature (list generic-function method)
  217.              'function add-method-method)))
  218.           
  219.   ;; should be enough
  220.   (add-method allocate-instance
  221.           (make-instance method
  222.                  'signature (list class object)
  223.                  'function
  224.                  generic_allocate_instance\,StandardClass))
  225.  
  226.   (add-method allocate-instance 
  227.           (generic_initialize_instance\,Method
  228.            (generic_allocate_instance\,Method_Class method nil)
  229.            (list 'signature (list generic-class object)
  230.              'function generic_allocate_instance\,Generic_Class)))
  231.  
  232.   (add-method initialize-instance 
  233.           (generic_initialize_instance\,Method
  234.            (generic_allocate_instance\,Method_Class method nil)
  235.            (list 'signature (list generic-function object)
  236.              'function generic_initialize_instance\,Generic)))
  237.  
  238.   (add-method allocate-instance
  239.           (make-instance method
  240.                  'signature (list structure-class object)
  241.                  'function
  242.                  generic_allocate_instance\,StructureClass))
  243.  
  244.   (add-method allocate-instance
  245.           (make-instance method
  246.                  'signature (list slot-description-class object)
  247.                  'function
  248.                  generic_allocate_instance\,Slot_Description_Class))
  249.  
  250.   (add-method allocate-instance
  251.           (make-instance method
  252.                  'signature (list condition-class object)
  253.                  'function
  254.                  generic_allocate_instance\,Condition_Class))
  255.  
  256.   (add-method allocate-instance 
  257.           (make-instance method
  258.                  'signature (list primitive-class object)
  259.                  'function
  260.                  generic_allocate_instance\,Primitive_Class))
  261.  
  262.   (add-method initialize-instance 
  263.           (make-instance method
  264.                  'signature (list object object)
  265.                  'function
  266.                  generic_initialize_instance\,Object))
  267.  
  268.   (add-method initialize-instance
  269.           (make-instance method
  270.                  'signature (list class object)
  271.                  'function 
  272.                  generic_initialize_instance\,Standard_Class))
  273.  
  274.   (add-method initialize-instance 
  275.           (make-instance method
  276.                  'signature (list slot-description object)
  277.                  'function
  278.                  generic_initialize_instance\,Slot_Description))
  279.  
  280.   (add-method initialize-instance 
  281.           (make-instance method
  282.                  'signature (list condition object)
  283.                  'function
  284.                  generic_initialize_instance\,Default_Condition))
  285.   ;; More initting
  286.   (add-method compute-class-precedence-list
  287.           (make-instance method
  288.                  'signature (list class)
  289.                  'function generic_compute_class_precedence_list\,Standard_Class))
  290.  
  291.  
  292.   ;; slot access
  293.  
  294.   (add-method slot-value-using-class
  295.           (make-instance method
  296.                  'signature (list class object object)
  297.                  'function generic_slot_value_using_class\,Standard_Class))
  298.  
  299.   (add-method slot-value-using-class
  300.           (make-instance method
  301.                  'signature (list structure-class object object)
  302.                  'function generic_slot_value_using_class\,Structure_Class))
  303.  
  304.   
  305.   (add-method (setter slot-value-using-class)
  306.           (make-instance method
  307.                  'signature (list class object object object)
  308.                  'function generic_slot_value_using_class_setter\,Standard_Class))
  309.  
  310.   (add-method (setter slot-value-using-class)
  311.           (make-instance method
  312.                  'signature (list structure-class object object object)
  313.                  'function generic_slot_value_using_class_setter\,StructureClass))
  314.  
  315.   (add-method slot-value-using-slot-description
  316.           (make-instance method 
  317.                  'signature (list object local-slot-description)
  318.                  'function 
  319.                  generic_slot_value_using_slot_description\,Object\,Local_Slot_Description))
  320.  
  321.   (add-method slot-value-using-slot-description
  322.           (make-instance method 
  323.                  'signature (list object local-slot-description)
  324.                  'function 
  325.                  generic_slot_value_using_slot_description\,Object\,Local_Slot_Description))
  326.  
  327.   (add-method (setter slot-value-using-slot-description)
  328.           (make-instance method 
  329.                  'signature (list object local-slot-description object)
  330.                  'function ;; should have been called fred.
  331.                  generic_slot_value_using_slot_description_setter\,Object\,Local_Slot_Description))
  332.   
  333.   (add-method find-slot-description 
  334.           (make-instance method
  335.                  'signature (list structure-class object)
  336.                  'function generic_find_slot_description\,Structure_Class))
  337.  
  338.   (add-method find-slot-description 
  339.           (make-instance method
  340.                  'signature (list class object)
  341.                  'function generic_find_slot_description\,Standard_Class))
  342.  
  343.   (add-method make-slot-description 
  344.           (make-instance method 
  345.                  'signature (list class object)
  346.                  'function generic_make_slot_description\,Standard_Class))
  347.  
  348.   (add-method make-inherited-slot-description
  349.           (make-instance method
  350.                  'signature (list class slot-description object)
  351.                  'function
  352.                  generic_make_inherited_slot_description\,Standard_Class\,Slot_Description))
  353.  
  354.   (add-method add-slot-description
  355.           (make-instance method
  356.                  'signature (list class slot-description)
  357.                  'function generic_add_slot_description\,StandardClass\,SlotDescription))
  358.  
  359.   
  360.   (add-method add-slot-description
  361.           (make-instance method
  362.                  'signature (list class local-slot-description)
  363.                  'function 
  364.                  generic_add_slot_description\,StandardClass\,LocalSlotDescription))
  365.  
  366.   
  367.   
  368.   ;; streams
  369.  
  370.   (add-method generic-write 
  371.           (make-instance method
  372.                  'signature (list object object)
  373.                  'function generic_generic_write\,Object))
  374.   (add-method generic-prin
  375.           (make-instance method
  376.                  'signature (list object object)
  377.                  'function generic_generic_prin\,Object))
  378.  
  379.   (add-method generic-prin
  380.           (make-instance method
  381.                  'signature (list pair object)
  382.                  'function generic_generic_prin\,Cons))
  383.  
  384.   ;; arithmetic...
  385.   
  386.  
  387.   (add-method binary-plus
  388.           (make-instance method
  389.                  'signature (list number number)
  390.                  'function generic_binary_plus\,Number\,Number))
  391.  
  392.   (add-method binary-plus 
  393.           (make-instance method
  394.                  'signature (list integer integer)
  395.                  'function generic_binary_plus\,Integer\,Integer))
  396.  
  397.   (add-method binary-difference
  398.           (make-instance method
  399.                  'signature (list number number)
  400.                  'function generic_binary_difference\,Number\,Number))
  401.  
  402.   (add-method binary-difference 
  403.           (make-instance method
  404.                  'signature (list integer integer)
  405.                  'function generic_binary_difference\,Integer\,Integer))
  406.  
  407.   (add-method binary-times
  408.           (make-instance method
  409.                  'signature (list number number)
  410.                  'function generic_binary_times\,Number\,Number))
  411.  
  412.   (add-method binary-times 
  413.           (make-instance method
  414.                  'signature (list integer integer)
  415.                  'function generic_binary_times\,Integer\,Integer))
  416.  
  417.   (add-method binary-divide
  418.           (make-instance method
  419.                  'signature (list number number)
  420.                  'function generic_binary_divide\,Number\,Number))
  421.  
  422.  
  423.   (add-method binary-gcd 
  424.           (make-instance method
  425.                  'signature (list integer integer)
  426.                  'function generic_binary_gcd\,Integer\,Integer))
  427.  
  428.  
  429.   (add-method binary-lcm 
  430.           (make-instance method
  431.                  'signature (list integer integer)
  432.                  'function generic_binary_lcm\,Integer\,Integer))
  433.  
  434.           
  435.   (add-method =
  436.           (make-instance method
  437.                  'signature (list number number)
  438.                  'function generic_eqn\,Number\,Number))
  439.  
  440.   (add-method equal 
  441.           (make-instance method
  442.                  'signature (list number number)
  443.                  'function generic_equal\,Number\,Number))
  444.  
  445.   (add-method zerop
  446.           (make-instance method
  447.                  'signature (list number )
  448.                  'function generic_zerop\,Number))
  449.  
  450.   (add-method abs
  451.           (make-instance method 
  452.                  'signature (list number)
  453.                  'function generic_abs\,Number))
  454.  
  455.   (add-method binary-lt 
  456.           (make-instance method 
  457.                  'signature (list number number)
  458.                  'function generic_binary_lt\,Number\,Number))
  459.  
  460.   (add-method binary-gt 
  461.           (make-instance method 
  462.                 'signature (list integer integer)
  463.                 'function generic_binary_gt\,Integer\,Integer))
  464.   (add-method binary-lt 
  465.           (make-instance method 
  466.                  'signature (list integer integer)
  467.                  'function generic_binary_lt\,Integer\,Integer))
  468.  
  469.   (add-method binary-gt 
  470.           (make-instance method 
  471.                 'signature (list number number)
  472.                 'function generic_binary_gt\,Number\,Number))
  473.   
  474.   ;; threads
  475.   ;; Note that these 2 only exist in BSD+SYSV versions...
  476.   (if (eq (feel-machine-type) 'generic)
  477.       ()
  478.     (progn (add-method allocate-instance 
  479.                (make-instance method 
  480.                       'signature (list thread-class object)
  481.                       'function generic_allocate_instance\,Thread_Class))
  482.  
  483.  
  484.        (add-method initialize-instance
  485.                (make-instance method 
  486.                       'signature (list thread object)
  487.                       'function generic_initialize_instance\,Thread_Class))
  488.  
  489.  
  490.        (add-method generic-prin 
  491.                (make-instance method
  492.                       'signature (list thread object)
  493.                       'function generic_generic_prin\,Thread\,Object))
  494.  
  495.        (add-method generic-write
  496.                (make-instance method
  497.                       'signature (list thread object)
  498.                       'function generic_generic_write\,Thread\,Object))
  499.        ))
  500.   ;; form ccc.c...
  501.   (add-method equal
  502.           (make-instance method
  503.                  'signature (list object object)
  504.                  'function generic_equal\,Object\,Object))
  505.   (add-method equal
  506.           (make-instance method
  507.                  'signature (list pair pair)
  508.                  'function generic_equal\,Cons\,Cons))
  509.   (add-method equal
  510.           (make-instance method
  511.                  'signature (list vector vector)
  512.                  'function generic_equal\,Vector\,Vector))
  513.  
  514.   (add-method equal
  515.           (make-instance method
  516.                  'signature (list structure structure)
  517.                  'function generic_equal\,Basic_Structure\,Basic_Structure))
  518.   (add-method equal
  519.           (make-instance method
  520.                  'signature (list class class)
  521.                  'function generic_equal\,Standard_Class\,Standard_Class))
  522.  
  523.   (add-method copy 
  524.           (make-instance method
  525.                  'signature (list object)
  526.                  'function generic_copy\,Object))
  527.   (add-method copy 
  528.           (make-instance method
  529.                  'signature (list pair)
  530.                  'function generic_copy\,Cons))
  531.   (add-method copy 
  532.           (make-instance method
  533.                  'signature (list vector)
  534.                  'function generic_copy\,Vector))
  535.  
  536.  
  537.   ;; and lastly...
  538.   (add-method compute-discriminating-function 
  539.           (make-instance method
  540.                  'signature (list generic-function)
  541.                  'function compute-discriminating-function-as-method))
  542.  
  543.   ;; end module
  544.   )
  545.